#include <iostream>
using namespace std;

class Solution
{
public:
    int myAtoi(string s)
    {
        // 首先找出符合要求的字符串
        // 排除前置空格
        if (!PreProcess(s))
        {
            return 0;
        }
        // 判断第一个字符是否合法，只能是+，-或者数字
        if (!(s[0] == '+' || s[0] == '-' || isdigit(s[0])))
        {
            return 0;
        }

        // 中间的只能是数字字符，遇到非数字字符停止查找
        int counter;
        if (s[0] == '+' || s[0] == '-') {
            counter = 1;
        }
        for (; counter < s.length(); ++counter)
        {
            if (!isdigit(s[counter]))
            {
                s.assign(s.begin(), s.begin() + counter);
                break;
            }
        }

        // 去除前置的0，以及处理特殊情况
        if (!DelPreZero(s))
        {
            return 0;
        }

        // 判断该字符串是否满足范围要求
        return RangeOk(s);
    }

private:
    void pstr(string &s);
    int RangeOk(string &s)
    {
        // 首先根据需要把INT_MAX和INT_MIN转换成字符串
        string tmp;
        if (s[0] == '-')
        { // 负数范围检查
            tmp = to_string(INT_MIN);
        }
        else if (s[0] == '+')
        { // 正数范围检查
            s.assign(s.begin() + 1, s.end());
            tmp = to_string(INT_MAX);
        }
        else
        {
            tmp = to_string(INT_MAX);
        }

        if (s.length() < tmp.length())
        {
            return stoi(s);
        }
        if (s.length() > tmp.length())
        {
            return stoi(tmp);
        }
        // 字符串比较
        if (strcmp(s.c_str(), tmp.c_str()) <= 0)
        {
            return stoi(s);
        }
        return stoi(tmp);
    }

    bool DelPreZero(string &s)
    {
        // 去除前置0
        int counter = 0;
        if (!isdigit(s[0]))
        { // 第一个字符不是数字
            ++counter;
        }

        for (; counter < s.length() && s[counter] == '0'; ++counter)
            ; // 查找第一个非零位置
        if (!isdigit(s[0]))
        {
            s[--counter] = s[0];
        }

        s.assign(s.begin() + counter, s.end());

        if (s == "-" || s == "+" || s.length() == 0)
        {
            return false;
        }

        return true;
    }

    bool PreProcess(string &s)
    {
        // 去除前置空格
        for (int counter = 0; counter < s.length(); ++counter)
        {
            if (s[counter] != ' ')
            {
                s.assign(s.begin() + counter, s.end());
                break;
            }
        }

        if (s.length() == 0)
        {
            return false;
        }
        return true;
    }
};

void Solution::pstr(string &s)
{
    cout<<s<<endl;
}

int main()
{
    Solution sol;
    cout << sol.myAtoi("00000-42a1234") << endl;
}
